﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionManoDeObra.BusinessEntity;
using System.Data.SqlClient;

namespace GestionManoDeObra.DataAccess
{
    public class ImplementoTrabajadorDetalleDAL
    {
        public void Crear(IList<ImplementoTrabajadorDetalle> listaImplementoTrabajadorDetalle)
        {
            string sql = "INSERT INTO ImplementoTrabajadorDetalle (IdImplementoTrabajadorDetalle, IdImplementoTrabajador, IdImplemento, Estado) values (@IdImplementoTrabajadorDetalle, @IdImplementoTrabajador, @IdImplemento, @Estado)";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                foreach (ImplementoTrabajadorDetalle item in listaImplementoTrabajadorDetalle)
                {
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        com.Parameters.Add(new SqlParameter("@IdImplementoTrabajadorDetalle", item.IdImplementoTrabajadorDetalle));
                        com.Parameters.Add(new SqlParameter("@IdImplementoTrabajador", item.IdImplementoTrabajador));
                        com.Parameters.Add(new SqlParameter("@IdImplemento", item.IdImplemento));
                        com.Parameters.Add(new SqlParameter("@Estado", item.Estado));
                        com.ExecuteNonQuery();

                    }
                }
            }        
        }

        public void CrearDetalle(int IdImplementoTrabajador, IList<ImplementoCarrito> listaImplementoCarrito)
        {
            string sql = "INSERT INTO t_ImplementoTrabajadorDetalle (IdImplementoTrabajador, IdImplemento, Estado) values (@IdImplementoTrabajador, @IdImplemento, @Estado)";
            int IdImplementoDisponible;
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                foreach (ImplementoCarrito item in listaImplementoCarrito)
                {
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        IdImplementoDisponible = ObtenerIdImplementoDisponible(item.IdCategoriaImplemento);

                        com.Parameters.Add(new SqlParameter("@IdImplementoTrabajador", IdImplementoTrabajador));
                        com.Parameters.Add(new SqlParameter("@IdImplemento", IdImplementoDisponible));
                        com.Parameters.Add(new SqlParameter("@Estado", "P"));
                        com.ExecuteNonQuery();

                        ActualizarDisponibilidadImplemento(IdImplementoDisponible);
                    }
                }
            }
        }

        public void DevolverDetalle(IList<ImplementoCarrito> listaImplementoCarrito)
        {
            string sql = "UPDATE t_ImplementoTrabajadorDetalle SET Estado = 'D' WHERE IdImplementoTrabajadorDetalle = @IdImplementoTrabajadorDetalle";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                foreach (ImplementoCarrito item in listaImplementoCarrito)
                {
                    if (item.Estado.Equals("P"))
                    {
                        using (SqlCommand com = new SqlCommand(sql, con))
                        {
                            com.Parameters.Add(new SqlParameter("@IdImplementoTrabajadorDetalle", item.IdImplementoTrabajadorDetalle));
                            com.ExecuteNonQuery();

                            ActualizarDevolucionImplemento(item.IdImplemento);
                        }
                    }
                }
            }
        }

        private int ObtenerIdImplementoDisponible(int IdCategoriaImplemento)
        {
            string sql = "select min(IdImplemento) from t_Implemento where IdCategoriaImplemento = @IdCategoriaImplemento and Estado= '0'";
            int IdImplementoDisponible;
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@IdCategoriaImplemento", IdCategoriaImplemento));
                    IdImplementoDisponible = (int)com.ExecuteScalar();

                    return IdImplementoDisponible;
                }
            }
        }

        private void ActualizarDisponibilidadImplemento(int IdImplemento) 
        {
            string sql = "update t_Implemento set Estado='1' where IdImplemento=@IdImplemento";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();

                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@IdImplemento", IdImplemento));
                    com.ExecuteNonQuery();
                }
            }
        }

        private void ActualizarDevolucionImplemento(int IdImplemento)
        {
            string sql = "update t_Implemento set Estado='0' where IdImplemento=@IdImplemento";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();

                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@IdImplemento", IdImplemento));
                    com.ExecuteNonQuery();
                }
            }
        }

        public IList<ImplementoCarrito> ObtenerDetallePrestados(int IdImplementoTrabajador)
        {
            IList<ImplementoCarrito> detalle = new List<ImplementoCarrito>();
            ImplementoCarrito item = null;
            string sql = "";
            sql = sql + "select it.IdImplementoTrabajador, d.IdImplementoTrabajadorDetalle, d.IdImplemento, c.Nombre, c.IdCategoriaImplemento, d.Estado as EstadoImplemento ";
            sql = sql + "from t_implementotrabajadordetalle d, ";
            sql = sql + "t_ImplementoTrabajador it, ";
            sql = sql + "t_implemento i, ";
            sql = sql + "t_categoriaImplemento c ";
            sql = sql + "where ";
            sql = sql + "d.idImplemento = i.idImplemento ";
            sql = sql + "and i.IdcategoriaImplemento = c.IdCategoriaImplemento  ";
            sql = sql + "and d.IdImplementoTrabajador = it.IdImplementoTrabajador ";
            sql = sql + "and d.estado = 'P' ";
            sql = sql + "and d.IdImplementoTrabajador = @IdImplementoTrabajador ";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@IdImplementoTrabajador", IdImplementoTrabajador));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            item = new ImplementoCarrito()
                            {
                                IdImplementoTrabajadorDetalle = (int)resultado["IdImplementoTrabajadorDetalle"],
                                IdImplemento = (int)resultado["IdImplemento"],
                                NombreCategoria = (string)resultado["Nombre"],
                                IdCategoriaImplemento = (int)resultado["IdCategoriaImplemento"],
                                Estado = (string)resultado["EstadoImplemento"]
                            };

                            detalle.Add(item);
                        }
                    }
                }
            }
            return detalle;
        }

        public IList<ImplementoCarrito> ObtenerDetalleDevueltos(int IdImplementoTrabajador)
        {
            IList<ImplementoCarrito> detalle = new List<ImplementoCarrito>();
            ImplementoCarrito item = null;
            string sql = "";
            sql = sql + "select it.IdImplementoTrabajador, d.IdImplementoTrabajadorDetalle, d.IdImplemento, c.Nombre, c.IdCategoriaImplemento, d.Estado as EstadoImplemento ";
            sql = sql + "from t_implementotrabajadordetalle d, ";
            sql = sql + "t_ImplementoTrabajador it, ";
            sql = sql + "t_implemento i, ";
            sql = sql + "t_categoriaImplemento c ";
            sql = sql + "where ";
            sql = sql + "d.idImplemento = i.idImplemento ";
            sql = sql + "and i.IdcategoriaImplemento = c.IdCategoriaImplemento  ";
            sql = sql + "and d.IdImplementoTrabajador = it.IdImplementoTrabajador ";
            sql = sql + "and d.estado = 'D' ";
            sql = sql + "and d.IdImplementoTrabajador = @IdImplementoTrabajador ";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@IdImplementoTrabajador", IdImplementoTrabajador));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            item = new ImplementoCarrito()
                            {
                                IdImplementoTrabajadorDetalle = (int)resultado["IdImplementoTrabajadorDetalle"],
                                IdImplemento = (int)resultado["IdImplemento"],
                                NombreCategoria = (string)resultado["Nombre"],
                                IdCategoriaImplemento = (int)resultado["IdCategoriaImplemento"],
                                Estado = (string)resultado["EstadoImplemento"]
                            };

                            detalle.Add(item);
                        }
                    }
                }
            }
            return detalle;
        }


        public IList<ImplementoTrabajadorDetalle> Obtener(int IdImplementoTrabajadorDetalle)
        {
            IList<ImplementoTrabajadorDetalle> detalle = new List<ImplementoTrabajadorDetalle>();
            ImplementoTrabajadorDetalle item = null;
            string sql = "SELECT * FROM ImplementoTrabajadorDetalle WHERE IdImplementoTrabajadorDetalle = @IdImplementoTrabajadorDetalle";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@IdImplementoTrabajadorDetalle", IdImplementoTrabajadorDetalle));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            item = new ImplementoTrabajadorDetalle()
                            {
                                IdImplementoTrabajadorDetalle = (int)resultado["IdImplementoTrabajadorDetalle"],
                                IdImplementoTrabajador = (int)resultado["IdImplementoTrabajador"],
                                IdImplemento = (int)resultado["IdImplemento"],
                                Estado = (string)resultado["Estado"]
                            };

                            detalle.Add(item);
                        }
                    }
                }
            }
            return detalle;
        }
    }
}
